#!/usr/bin/env bash
# =========================================================
#  git.sh  ——  通用仓库交互快捷菜单
#  放到任何目录下直接运行，自动初始化仓库并连接远程
# =========================================================

set -e

############################ 通用小函数 ############################
info()  { echo -e "\033[1;36m[INFO]\033[0m $*"; }
warn()  { echo -e "\033[1;33m[WARN]\033[0m $*"; }
err()   { echo -e "\033[1;31m[ERR]\033[0m $*"  ; }
pause() { read -rp "按 Enter 返回主菜单..."; }

######################## 首次：初始化仓库 ########################
init_repo() {
    if [[ -d .git ]]; then
        info "当前目录已是 Git 仓库。"
    else
        warn "检测到当前目录不是 Git 仓库，准备初始化..."
        git init
        read -rp "请输入远程仓库 SSH 地址（如 git@gitee.com:user/repo.git）: " ssh_url
        git remote add origin "$ssh_url" 2>/dev/null || warn "远程 origin 已存在，跳过添加。"
        info "仓库已初始化并连接远程。"
    fi
}

######################## 新增： 远程/SSH 配置 ########################
remote_menu() {
    while :; do
        clear
        cat <<EOF
=================== 远程 & SSH 配置 ===================
1) 查看当前远程地址
2) 修改 / 设置远程地址
3) 生成并上传 SSH 公钥到 Gitee
4) 测试 SSH 连通性 (ssh -T git@gitee.com)
0) 返回主菜单
=======================================================
EOF
        read -rp "请选择: " r
        case $r in
            1)
                git remote -v
                pause ;;
            2)
                read -rp "新的 SSH 地址: " new_url
                git remote set-url origin "$new_url"
                info "远程地址已更新。"
                pause ;;
            3)
                # 若已有公钥则直接打印；否则生成
                key_file=~/.ssh/id_ed25519
                [[ -f $key_file ]] || key_file=~/.ssh/id_rsa
                if [[ ! -f $key_file ]]; then
                    read -rp "请输入你的邮箱 (用于生成密钥注释): " email
                    ssh-keygen -t ed25519 -C "$email" -f "$key_file" -N ""
                fi
                echo
                info "=== 公钥内容 ==="
                cat "$key_file.pub"
                echo
                info "请把上面整段公钥复制到 Gitee：头像 → 设置 → SSH 公钥 → 添加"
                pause ;;
            4)
                ssh -T git@gitee.com
                pause ;;
            0) break ;;
            *) err "无效选项"; sleep 1 ;;
        esac
    done
}

######################## 分支相关 ########################
branch_menu() {
    while :; do
        clear
        cat <<EOF
==================== 分支管理 ====================
1) 查看所有本地/远程分支
2) 创建并切换到新分支
3) 切换到已有分支（本地）
4) 删除本地分支
0) 返回主菜单
==================================================
EOF
        read -rp "请选择: " b
        case $b in
            1) git branch -a | head -n 20; pause ;;
            2) read -rp "新分支名: " nb; git checkout -b "$nb"; pause ;;
            3) read -rp "分支名: " ob; git checkout "$ob"; pause ;;
            4) read -rp "要删除的本地分支名: " db; git branch -d "$db"; pause ;;
            0) break ;;
            *) err "无效选项"; sleep 1 ;;
        esac
    done
}

######################## 查看改动 ########################
show_diff() {
    clear
    echo "====================== 当前改动 ======================"
    echo "1) 工作区 vs 暂存区"
    git diff
    echo
    echo "2) 暂存区 vs 上一次提交"
    git diff --cached
    echo
    echo "3) 工作区 vs 上一次提交"
    git diff HEAD
    pause
}

######################## 提交 & 推送 ########################
commit_push() {
    clear
    echo "====================== 提交 & 推送 ====================="
    gs=$(git status --porcelain)
    if [[ -z $gs ]]; then
        info "无改动，无需提交。"
        pause
        return
    fi
    git status -sb
    read -rp "确认提交并推送？(y/n): " yn
    [[ $yn != y ]] && return
    read -rp "提交信息: " msg
    git add -A
    git commit -m "$msg"
    current_branch=$(git rev-parse --abbrev-ref HEAD)
    git push origin "$current_branch"
    info "已推送到远程 $current_branch"
    pause
}

######################## 回退到远程最新 ########################
hard_reset() {
    clear
    current_branch=$(git rev-parse --abbrev-ref HEAD)
    echo "============================================"
    echo "即将把当前分支 $current_branch 回退到远程最新"
    echo "本地未推送的提交和未 add 的改动将全部丢失！"
    echo "============================================"
    read -rp "确认继续？(y/n): " yn
    [[ $yn != y ]] && return
    git fetch origin
    git reset --hard "origin/$current_branch"
    info "已回退到远程最新版本。"
    pause
}

######################## 主菜单 ########################
main_menu() {
    while :; do
        clear
        cat <<EOF
=================== Git 快捷菜单 ===================
当前目录: $(pwd)
当前分支: $(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "无")
---------------------------------------------------
1) 查看仓库状态
2) 分支管理（创建/切换/删除）
3) 拉取最新（git pull --rebase）
4) 查看我的改动
5) 提交并推送到远程
6) 回退到远程最新版本
7) 远程 & SSH 配置
0) 退出
===================================================
EOF
        read -rp "请选择: " c
        case $c in
            1) git status -sb; pause ;;
            2) branch_menu ;;
            3) current_branch=$(git rev-parse --abbrev-ref HEAD)
               if ! git config "branch.$current_branch.merge" >/dev/null 2>&1; then
                   git branch --set-upstream-to="origin/$current_branch" "$current_branch" 2>/dev/null || true
               fi
               git pull --rebase
               pause ;;
            4) show_diff ;;
            5) commit_push ;;
            6) hard_reset ;;
            7) remote_menu ;;
            0) info "再见！"; exit 0 ;;
            *) err "无效选项"; sleep 1 ;;
        esac
    done
}

######################## 主流程 ########################
init_repo
main_menu
